package _9algorithm;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 简易数学算法练习
 * @Author wangzhen
 * @Date 2023/5/17 22:22
 **/
public class _2_SimpleAlgorithmTest {

    public static void main(String[] args){
        _2_SimpleAlgorithmTest.computeMoney();
    }

    /**
     * 题1：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和
     */
    public static void numListAvg(){
        double num1=2;
        double num2=1;

        double num2Tistroy=1;

        double count=0;
        for(int i=1;i<=20;i++){
            double tmpNum=num2;
            double result=num1/num2;

            //四舍五入并保留一位小数
            count+=result;

            System.out.println(num1+"/"+num2+"="+result);

            num1=num1+num2;
            num2=num2Tistroy+num2;
            num2Tistroy=tmpNum;
        }
        System.out.println("20项之和="+new BigDecimal(String.valueOf(count)).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue());

    }


    /*
      题2：字符串中出现最多的字符
   */
    public static void maxChar(){
        String str="qwejuxznmk'xzcasdytu";

        char result=' ';
        int count=0;
        for(int i=0;i<str.length();i++){
            char s1=str.charAt(i);
            int max=0;

            for(int j=0;j<str.length();j++){
                if(str.charAt(j)==s1){
                    max++;
                }
            }
            if(max>count){
                result=s1;
            }
        }

        System.out.println("字符串中出现最多的字符:"+result);
    }


    /*
      题2：英语句子中的最长单词，一个英文句子（长度不超过255），只含有字母和空格和,.符号，输出最长的一个单词。如有多个长度相同的单词，则输出最前面的一个。
         输入: 一个字符串。
         输出: 一个字符串。
         测试句子: If you remember me, then I don't care if everyone else forgets.
   */
    public static void maxEnText(){
        String en="If you remember me, then I don't care if everyone else forgets.";

        String replace = en.replace(",", "").replace(".", "");

        String[] split = replace.split(" ");
        int index=0;
        int maxLength=0;
        for(int i=0;i<split.length;i++){
            if(split[i].length()>maxLength){
                maxLength=split[i].length();
                index=i;
            }
        }

        System.out.println(split[index]);
    }

    /*
      题4：字符压缩：将abbeeerrrrr压缩成：a1b2e3r5
   */
    public static void textCompress(){
        String str="FaaafFF";

        int index=0;
        StringBuilder compress=new StringBuilder(4);
        while (index<str.length()){

            int step=1;
            char c = str.charAt(index);
            while (true){
                if(index+step>str.length()-1){
                    break;
                }
                if(c==str.charAt(index+step)){
                    step++;
                }else{
                    break;
                }

            }
            index+=step;
            compress.append(c).append(step);
        }

        System.out.println(compress.toString());
    }

    /**
     * 题5：有一款竞技游戏有五个辅助：辅助，射手，法师，打野，战士
     * 要求每个匹配的队伍至少要包含三种职业以上
     */
    public static void gameMatch(){
        String[] arr={"战士","打野","法师","射手","辅助"};

        List<String> team=new ArrayList<>();

        while (true){
            int random=(int)(Math.random()*5);
            String player=arr[random];

            if(team.size()<3){
                int flag=0;
                for(String str :team){
                    if(str.equals(player)){
                        flag=1;
                        break;
                    }
                }
                if(flag==0){
                    team.add(player);
                }


            }else{
                team.add(player);
            }

            if(team.size()>=5){
                break;
            }
        }
        System.out.println(team);

    }

    /**
     * 题6：父亲准备为小明的四年大学生活一次性储蓄一笔钱，使用整存零取的方式，控制小龙每月月底取1000元准备下月使用。
     * 假设银行一年整存零取的年息为1.71%，请算出小明父亲至少需要存人多少钱才行。
     *
     * 解题:
     * 1.分析出关键的几个信息：4年共计48个月、一年利息0.0171，那个每月的利息就是0.001425
     * 2.可知在第47个月取钱后，卡里正好剩1000，这1000是由本金加当月利息组成，利息=1000x0.001425=1.425元，第48月就是998.575本金+1.425利息组成的1000元
     *
     * 第48月本利合计:1000,利息:1.4250,利息差:-1.4250,减去利息还剩:998.5750
     * 第47月本利合计:1998.5750,利息:2.8480,利息差:-1.4230,减去利息还剩:1995.7270
     * 第46月本利合计:2995.7270,利息:4.2689,利息差:-1.4209,减去利息还剩:2991.4581
     * 第45月本利合计:3991.4581,利息:5.6878,利息差:-1.4189,减去利息还剩:3985.7703
     * 第44月本利合计:4985.7703,利息:7.1047,利息差:-1.4169,减去利息还剩:4978.6656
     * 第43月本利合计:5978.6656,利息:8.5196,利息差:-1.4149,减去利息还剩:5970.1460
     * 第42月本利合计:6970.1460,利息:9.9325,利息差:-1.4129,减去利息还剩:6960.2135
     * 第41月本利合计:7960.2135,利息:11.3433,利息差:-1.4108,减去利息还剩:7948.8702
     * 第40月本利合计:8948.8702,利息:12.7521,利息差:-1.4088,减去利息还剩:8936.1181
     * 第39月本利合计:9936.1181,利息:14.1590,利息差:-1.4069,减去利息还剩:9921.9591
     * 第38月本利合计:10921.9591,利息:15.5638,利息差:-1.4048,减去利息还剩:10906.3953
     * 第37月本利合计:11906.3953,利息:16.9666,利息差:-1.4028,减去利息还剩:11889.4287
     * 第36月本利合计:12889.4287,利息:18.3674,利息差:-1.4008,减去利息还剩:12871.0613
     *
     * 粗略计算最后一年的利息和本金，可以看到每月利息差是有规律的，每个月少了0.002元，根据这规律把每个月的利息加起来就是总利息，48000-总利息=小明父亲存储的本金
     *
     */
    public static void computeMoney(){

        BigDecimal result=new BigDecimal("0");
        BigDecimal lxc=new BigDecimal("0");
        for(int i=48;i>0;i--){
            result=result.add(new BigDecimal("1000"));
            System.out.print("第"+i+"月本利合计:"+result.toString());
            BigDecimal lx = result.multiply(new BigDecimal("0.001425")).setScale(4,BigDecimal.ROUND_HALF_UP);
            System.out.print(",利息:"+lx.toString()+",利息差:"+lxc.subtract(lx));
            lxc=lx;
            result=result.subtract(lx).setScale(4,BigDecimal.ROUND_HALF_UP);
            System.out.println(",减去利息还剩:"+result.toString());
        }

        //根据这规律把每个月的利息加起来就是总利息，下面代码跑完后得到总利1635.2710，48000-1635.271=46364.729。小明父亲最少要存46365元
        BigDecimal zlx=new BigDecimal("1.425");
        BigDecimal sylx=new BigDecimal("1.425");
        BigDecimal total=new BigDecimal("0");
        for(int i=2;i<=48;i++){

            zlx=zlx.add(sylx).subtract(new BigDecimal(0.002*i).setScale(4,BigDecimal.ROUND_HALF_UP));
            total=total.add(zlx);
            System.out.println("第"+i+"月利息合计:"+total.toString());
        }

    }
}
